package com.eltsistemas.controller.afastamento;

import java.text.ParseException;
import java.util.Calendar;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.eltsistemas.adapter.Calendario;
import com.eltsistemas.dao.AfastamentoDao;
import com.eltsistemas.dao.GenericDao;
import com.eltsistemas.hibernate.HibernateUtil;
import com.eltsistemas.modelo.Afastamento;
import com.eltsistemas.modelo.Autorizacao;
import com.eltsistemas.modelo.Autorizacao_Afastamento;
import com.eltsistemas.modelo.Funcionario;
import com.eltsistemas.modelo.Usuario;

@Controller
@RequestMapping(value="/afastamento")
@SessionAttributes("usuario_Logado")
public class AfastamentoAdiciona {
	
	@RequestMapping(value="/adiciona", method=RequestMethod.POST)
	public String adiciona(Afastamento afastamento, String dtInicio, String dtFim, String nomeFuncionario,
						   String mot, @ModelAttribute("usuario_Logado") Usuario user) throws ParseException
	{
		try
		{
			//Comparando as datas
			Calendario calendario = new Calendario();
			
			Calendar dataInicio = calendario.getData(dtInicio);
			Calendar dataFim = calendario.getData(dtFim);
	
			if(calendario.compare_Data(dataInicio, dataFim) == true)
			{
				//Iniciando conexao e abrindo uma transacao
				Session session = new HibernateUtil().getSession();
				session.beginTransaction();
				
				GenericDao<Funcionario> daoFuncionario = new GenericDao<>(session, Funcionario.class);
				Funcionario funcionario = daoFuncionario.findByName(nomeFuncionario);
				
				AfastamentoDao daoAfast = new AfastamentoDao(session);
				if(daoAfast.verificaPeriodo(dataInicio, dataFim, funcionario.getId()) == null)
				{
					GenericDao<Afastamento> daoAfastamento = new GenericDao<>(session, Afastamento.class);
					
					//Atualiza o objeto afastamento
					afastamento.setDataInicio( dataInicio );
					afastamento.setDataFim( dataFim );
					afastamento.setFuncionario(funcionario);
					afastamento.setStatus_Atual(true);
				
					if(afastamento.getMotivo().equals("outros"))
					{
						afastamento.setMotivo(mot);
					}
					
					//Incluindo a autorizacao
					Autorizacao_Afastamento aut_Afastamento = new Autorizacao_Afastamento();
					aut_Afastamento.setData(Calendar.getInstance());
					aut_Afastamento.setDescricao("Criado");
					aut_Afastamento.setAfastamento(afastamento);
					aut_Afastamento.setNivel( user.getNivel_Autorizacao() );
					aut_Afastamento.setUsuario( user );
					aut_Afastamento.setAprovado(true);
					
					GenericDao<Autorizacao> daoAutorizacao= new GenericDao<>(session, Autorizacao.class);
					
					/* Salvando objeto no session, comitando os dados no banco e
					 * finalizando a conexao
					 */
					session = daoAfastamento.adiciona(afastamento);	
					session = daoAutorizacao.adiciona(aut_Afastamento);
					session.beginTransaction().commit();
					
					//Finalizando conexao
					session.close();
					
					return "redirect:lista?nomeFuncionario="+nomeFuncionario;	
				}
				
				else
				{
					//Finalizando conexao
					session.close();
					
					return "redirect:lista?valor=data-periodo-invalido&nomeFuncionario="+nomeFuncionario;	
				}
			}
				
			//Executa se a data final for menor que a data inicial
			return "redirect:lista?valor=data-final-maior&nomeFuncionario="+nomeFuncionario;	
		}
		catch(HibernateException e)
		{
			return "redirect:/painel/erro";
		}
		
	}
}
